package com.wanyangproject.androidlearning.designMode.decorator;

public class DecorateTest {
    private static final String TAG = "DecorateTest";

    /*
    * 装饰者模式：通常是为了增强对象的一些功能，使之不用继承就能添加附加功能。
    *            当不能采用继承来扩展或采用继承方式不利于系统维护时：第一类是当系统中存在大量的继承类会导致代码量剧增，类的数量也爆炸式增长；第二类是当类被final修饰时。
    *            主要结构：
    *            抽象构建角色：component 定义一个接口或抽象类，可以给对象动态的添加职责
    *            具体构建者角色：concreteComponent实际被动态添加职责的对象
    *            抽象装饰者角色：decorator 实现了component接口，并且持有一个component对象的实例
    *            具体装饰着角色：concreteDecorator 动态的添加职责的对象
    *
    * 具体示例：老王卖饮品，饮品分为豆浆和饮料两大类，其中豆浆又分为红糖豆浆，原味豆浆，牛奶豆浆，红糖牛奶豆浆等，饮料又分为碳酸饮料，茶饮料，功能性饮料，其中还有饮料和豆浆混合的饮品。先要将每一个具体品种的名称和价格体现出来，如果用继承将会产生类爆炸的情况，并且不灵活。因此可采用装饰者模式。
    *
    * */

    public static void main(String[] args){

        Soybean soybean = new Soybean();
        Suger suger = new Suger(soybean);
        Milk milk = new Milk(soybean);
        Coffee coffee = new Coffee(soybean);
        System.out.println(suger.getName()+"  价格："+suger.getPrice()+"元");
        System.out.println(milk.getName()+"  价格："+milk.getPrice()+"元");
        System.out.println(coffee.getName()+"  价格："+coffee.getPrice()+"元");

        Drink coffeeMilkSoyBean = new Coffee(milk);
        System.out.println(coffeeMilkSoyBean.getName()+"  价格："+coffeeMilkSoyBean.getPrice()+"元");
        Drink sugerMilkSoyBean = new Suger(milk);
        System.out.println(sugerMilkSoyBean.getName()+"  价格："+sugerMilkSoyBean.getPrice()+"元");



    }

}
